package com.aop.advie;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;

import java.util.concurrent.Executor;

/**
 * 自定义通知类
 * 也就是代理对象为目标对象准备的增方法
 *
 * @Aspect 说明这是个 通知对象
 * */
@Aspect
public class MyAdvice  {
    /**
    * 通知增强的形式
     * 1.前置通知
     * 2.后置通知-抛异常不执行
     * 3.环绕通知  前后执行
     * 4.异常通知 抛异常才执行
     * 5.后置通知-无论是否抛出异常都会通知
    * */

    /*@Pointcut只为保存（save）做通知*/
    @Pointcut("execution(* com.aop.dao.*ServiceImpl.*(..)))")
    public void pc(){

    }
    @Before("MyAdvice.pc()")
    public void before(){
        System.out.println("前置通知");
    }
    @AfterReturning("MyAdvice.pc()")
    public void aftrReturning(){
        System.out.println("后置通知-抛异常不执行");
    }
    public Object around(ProceedingJoinPoint point) throws Throwable {
        System.out.println("环绕通知前方法");
        Object object= point.proceed();
        System.out.println("环绕通知后方法");
        return object;
    }
    @AfterThrowing("execution(* com.aop.dao.*ServiceImpl.sace(..)))")
    public void afterException(){
        System.out.println("异常通知有异常就执行");
    }
    @After("execution(* com.aop.dao.*ServiceImpl.sace(..)))")
    public void  after(){
        System.out.println("后置通知-无论是否抛出异常都会执行");
    }

}
